package kr.co.bettersoft.carrotmemberstore.activity;
/**
 * RegisterPage
 * 가맹점 등록 화면 (웹뷰)
 * 
 * 가맹점 등록 URL 을 통해 웹뷰로 가맹점 등록 페이지를 띄움.
 * 
 * 화면 좌측에 가맹점 등록 데이터, 우측에 우편번호 선택 화면. -- (브라우저에서 처리.)
 * 
 * 등록 이후 알림창이 나오고 액티비티를 종료하여 로그인 페이지로 이동. 취소시에도 마찬가지로 액티비티 종료하고 로그인 페이지로 이동.
 * 
 * 특별한 화면 구성은 없지만, 웹에서 보내오는 신호를 받아서 처리하는 부분 구현 필요. (등록 완료(또는 에러) 및 등록 취소)
 * 
 */

import java.util.Locale;

import org.apache.http.util.EncodingUtils;
import kr.co.bettersoft.carrotmemberstore.R;
import kr.co.bettersoft.carrotmemberstore.common.CommonConstant;
//import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.HttpAuthHandler;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

//@SuppressLint("SetJavaScriptEnabled")
public class RegisterPage extends Activity {

	String TAG = "RegisterPage";

	public static Activity registerPage;

	View register_parent;

	WebView registerWebView;

	String loadingURL = (CommonConstant.domain).concat("/mSignUp.do");			 

	String postData = "";

	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바

	// 로케일
	Locale systemLocale = null;
	String strCountry = "";
	String strLanguage = "";

	Boolean connected;	// 통신상태

	Boolean nowLoading = false;			// 공지 가져오는 중에 재 요청 안하도록
	Boolean webPageLoaded = false;		// 공지 갱신없이 한번만 통신하도록 

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.register_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.register_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("setBackBlack")==1){
					register_parent.setBackgroundColor(Color.BLACK);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(RegisterPage.this, R.string.failed_to_open_page, Toast.LENGTH_SHORT).show();			// "페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다."
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w(TAG,"onCreate");
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.register_page);

		register_parent = findViewById(R.id.register_parent);

		registerWebView = (WebView) findViewById(R.id.register_webview);

		registerPage = RegisterPage.this;

		//사용자 지역, 언어
		systemLocale = getResources().getConfiguration().locale;
		strCountry = systemLocale.getCountry();
		strLanguage = systemLocale.getLanguage();

		registerWebView.setWebViewClient(new MyWebViewClient());
		registerWebView.setWebChromeClient(new MyWebChromeClient());  // MyWebChromeClient 지정         -- javascript 사용 됨. 
		registerWebView.addJavascriptInterface(new AndroidBridge(), "hybrid");
		WebSettings webSet = registerWebView.getSettings();
		// JavaScript 허용.
		webSet.setJavaScriptEnabled(true);
		// 확대/축소 금지. - 웹에서 차단함.
		//		webSet.setSupportZoom(true);
		//		webSet.setBuiltInZoomControls(true);
	}
	/**
	 * onResume
	 *  리쥼시에 호출되어 웹뷰 재로드 한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		if(CheckNetwork()){
			Log.d(TAG,"webPageLoaded:"+webPageLoaded+"//nowLoading:"+nowLoading);
			if(!webPageLoaded && !nowLoading){
				nowLoading = true;
				// 웹뷰는 비동기로 하지 않고 바로한다.
				postData = "Merchant-Language="+strLanguage+"&Merchant-Country="+strCountry;				// 파라미터 : Merchant-Language / Merchant-Country
				registerWebView.postUrl(loadingURL, EncodingUtils.getBytes(postData, "BASE64"));
				registerWebView.getSettings().setJavaScriptEnabled(true);
			}
		}else{
			finish();
			showErrMsg();
		}
	}

	/**
	 * Bridge Class
	 * 웹페이지로부터 요청을 받아서 처리한다.
	 */
	private class AndroidBridge {
		// 액티비티 종료
		/**
		 * finishActivity
		 *  액티비티 종료한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void finishActivity() {
			handler.post(new Runnable() {
				public void run() {
					//					finish();
				}
			});
		}
		// 버튼을 누르면 다음 페이지로 진행.
		/**
		 * nextRegisterPage
		 *  버튼을 누르면 다음 페이지로 진행한다
		 *
		 * @param leftUrl
		 * @param COUNTRY_CODE
		 * @param lan
		 * @return
		 */
		public void nextRegisterPage(String leftUrl, String COUNTRY_CODE, String lan){
			Intent nextIntent = new Intent(RegisterPage.this, RegisterPage2.class);
			nextIntent.putExtra("leftUrl", leftUrl);
			nextIntent.putExtra("COUNTRY_CODE", COUNTRY_CODE);
			nextIntent.putExtra("lan", lan);
			Log.w(TAG,"nextRegisterPage");
			Log.w(TAG,"leftUrl:"+leftUrl);
			startActivity(nextIntent);
		}
	}

	/**
	 * MyWebViewClient
	 * 페이지 로드, 완료 이벤트발생 가능한 웹뷰 클라이언트
	 *
	 */
	private class MyWebViewClient extends WebViewClient {
		@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
			Log.d(TAG,"shouldOverrideUrlLoading:"+url);
			view.loadUrl(url);
			return true;
		}

		/**
		 * onPageFinished
		 * 로딩 끝나면 프로그래스바 숨기고 재로딩 가능하도록한다
		 *
		 * @param view
		 * @param url
		 * @return
		 */
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			hidePb();
			setBackBlack();
			webPageLoaded = true;
			nowLoading = false;
		}
		/**
		 * onPageStarted
		 * 웹뷰 로딩 시작하면 시간 재서 로딩 안되면 멈추고 알린다.
		 *
		 * @param view
		 * @param url
		 * @param favicon
		 * @return
		 */
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			showPb();
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(CommonConstant.webPageLoadingMaxTime);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}finally{
						runOnUiThread(new Runnable(){
							public void run(){
								if(registerWebView.getProgress()<100) {
									// do what you want
									registerWebView.stopLoading();
									hidePb();
									finish();
									showErrMsg();
								}
							}
						});
						nowLoading = false;
					}
				}
			}).start();
		}


		@Override 
		public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { 
			// TODO Auto-generated method stub 
			Log.d(TAG,"doUpdateVisitedHistory");
			super.doUpdateVisitedHistory(view, url, isReload);  
		}  
		@Override 
		public void onFormResubmission(WebView view, Message dontResend, Message resend) {   
			// TODO Auto-generated method stub       
			Log.d(TAG,"onFormResubmission");
			super.onFormResubmission(view, dontResend, resend);   
		}    
		@Override  
		public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {  
			// TODO Auto-generated method stub     
			Log.d(TAG,"onReceivedHttpAuthRequest");
			super.onReceivedHttpAuthRequest(view, handler, host, realm);  
		}  
		//		@Override  
		//		public void onScaleChanged(WebView view, float oldScale, float newScale) {     
		//			// TODO Auto-generated method stub     
		//			super.onScaleChanged(view, oldScale, newScale);  
		//		}   
		//		@Override  
		//		public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {      
		//			// TODO Auto-generated method stub  
		//			super.onTooManyRedirects(view, cancelMsg, continueMsg);   
		//		}  
		@Override
		public void onUnhandledKeyEvent(WebView view, KeyEvent event) {  
			// TODO Auto-generated method stub     
			Log.d(TAG,"onUnhandledKeyEvent");
			super.onUnhandledKeyEvent(view, event);  
		}  
		@Override   
		public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {    
			// TODO Auto-generated method stub  
			Log.d(TAG,"shouldOverrideKeyEvent");
			return super.shouldOverrideKeyEvent(view, event);  
		}  

	}
	/**
	 * MyWebChromeClient
	 *  자바스크립트 alert 사용 위한 크롬 클라이언트이다
	 *
	 */
	private class MyWebChromeClient extends WebChromeClient {
		//Javascript alert 실행 가능함
		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			final JsResult finalRes = result;
			//AlertDialog 생성
			new AlertDialog.Builder(view.getContext())
			.setMessage(message)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finalRes.confirm(); 
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}
	// 배경 색상 전환
	/**
	 * setBackBlack
	 *  배경 색상 전환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setBackBlack(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "setBackBlack" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 


	/*
	 * 네트워크 상태 감지
	 * 
	 */
	/**
	 * CheckNetwork
	 *  네트워크 상태 감지한다
	 *
	 * @param
	 * @param
	 * @return connected
	 */
	public Boolean CheckNetwork(){
		ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		boolean isWifiAvailable = ni.isAvailable();
		boolean isWifiConn = ni.isConnected();
		ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		boolean isMobileAvail = ni.isAvailable();
		boolean isMobileConn = ni.isConnected();

		String status = "WiFi Avail="+isWifiAvailable+"//Conn="+isWifiConn
		+"//Mobile Avail="+isMobileAvail
		+"//Conn="+isMobileConn;
		if(!(isWifiConn||isMobileConn)){
			Log.w(TAG,status);
			hidePb();
			connected = false;
		}else{
			connected = true;
		}
		return connected;
	}

	/**
	 * finish
	 *  액티비티 종료한다
	 *
	 * @param
	 * @param
	 * @return 
	 */
	public void finishThis(){
		finish();
	}

	/**
	 * onPause
	 *  pause 시에 웹뷰 재로드 가능하게 해준다
	 *
	 * @param
	 * @param
	 * @return connected
	 */
	@Override
	public void onPause(){
		webPageLoaded = false;
		super.onPause();
	}


}
